/*
 * 2005-11-12 lxm 创建。
 */
package com.hd123.rumba.runtime;

import java.io.Serializable;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.text.ParseException;
import java.util.Date;

import net.sf.hibernate.HibernateException;

import com.hd123.rumba.exception.BusinessException;

/**
 * @author lxm
 * 
 * 对应IPersistent的数据交换对象
 */
public class DPersistent implements Serializable {

  private String uuid;

  // /////////////////////////
  // 用于 Web Service 数据交换

  /**
   * 取得指定类（或接口类）属性的取值。屏蔽任何Exception。
   * 
   * @param source
   *          源对象（或接口）
   * @param getMethodName
   *          属性的get方法名
   * @return 返回取值。
   */
  protected Object getPropValue(Object source, String getMethodName) {
    try {
      Method m = source.getClass().getMethod(getMethodName, (Class[]) null);
      return m.invoke(source, (Object[]) null);
    } catch (Exception e) {
      return null;
    }
  }

  protected Object getPropValue(Object source, String[] getMethodNames) {
    if (getMethodNames.length == 0)
      return null;
    try {
      Object obj = source;
      for (int i = 0; i < getMethodNames.length; i++) {
        Method m = obj.getClass().getMethod(getMethodNames[i], (Class[]) null);
        obj = m.invoke(obj, (Object[]) null);
      }
      return obj;
    } catch (Exception e) {
      return null;
    }
  }

  /**
   * 对指定类（或接口类）属性的赋值。屏蔽任何Exception。
   * 
   * @param target
   *          目标对象（或接口）
   * @param setMethodName
   *          属性的set方法名
   * @param value
   *          新的取值。
   */
  protected void setPropValue(Object target, String setMethodName, Object value) {
    try {
      Method m = target.getClass().getMethod(setMethodName, new Class[] {
        value.getClass() });
      m.invoke(target, new Object[] {
        value });
    } catch (Exception e) {
    }
  }

  /**
   * 对指定类（或接口类）属性的赋值。屏蔽任何Exception。
   * 
   * @param target
   * @param setMethodName
   * @param value
   * @param valueClass
   *          值的数据类型
   */
  protected void setPropValue(Object target, String setMethodName, Object value, Class valueClass) {
    try {
      Method m = target.getClass().getMethod(setMethodName, new Class[] {
        valueClass });
      m.invoke(target, new Object[] {
        value });
    } catch (Exception e) {
    }
  }

  /**
   * 导出String类型的对象属性。
   * 
   * @param source
   * @param getMethodName
   * @return
   */
  protected String exportString(Object source, String getMethodName) {
    Object obj = getPropValue(source, getMethodName);
    return obj == null ? null : (String) obj;
  }

  protected String exportString(Object source, String[] getMethodNames) {
    Object obj = getPropValue(source, getMethodNames);
    return obj == null ? null : (String) obj;
  }

  /**
   * 导出Integer类型的对象属性。
   * 
   * @param source
   * @param getMethodName
   * @return
   */
  protected String exportInteger(Object source, String getMethodName) {
    Object obj = getPropValue(source, getMethodName);
    return obj == null ? null : ((Integer) obj).toString();
  }

  protected String exportInteger(Object source, String[] getMethodNames) {
    Object obj = getPropValue(source, getMethodNames);
    return obj == null ? null : ((Integer) obj).toString();
  }

  /**
   * 导出Date类型的对象属性。
   * 
   * @param source
   * @param getMethodName
   * @return
   */
  protected String exportDatetime(Object source, String getMethodName) {
    Object obj = getPropValue(source, getMethodName);
    return obj == null ? null : FormatSettings.formatDatetime(FormatSettings.SDFyMdHms, (Date) obj);
  }

  protected String exportDatetime(Object source, String[] getMethodNames) {
    Object obj = getPropValue(source, getMethodNames);
    return obj == null ? null : FormatSettings.formatDatetime(FormatSettings.SDFyMdHms, (Date) obj);
  }

  /**
   * 导出BigDecimal类型的对象属性。
   * 
   * @param source
   * @param getMethodName
   * @return
   */
  protected String exportBigDecimal(Object source, String getMethodName) {
    Object obj = getPropValue(source, getMethodName);
    return obj == null ? null : ((BigDecimal) obj).toString();
  }

  protected String exportBigDecimal(Object source, String[] getMethodNames) {
    Object obj = getPropValue(source, getMethodNames);
    return obj == null ? null : ((BigDecimal) obj).toString();
  }

  /**
   * 导出Boolean类型的对象属性。
   * 
   * @param source
   * @param getMethodName
   * @return
   */
  protected String exportBoolean(Object source, String getMethodName) {
    Object obj = getPropValue(source, getMethodName);
    return obj == null ? null : ((Boolean) obj).toString();
  }

  protected String exportBoolean(Object source, String[] getMethodNames) {
    Object obj = getPropValue(source, getMethodNames);
    return obj == null ? null : ((Boolean) obj).toString();
  }

  /**
   * 导出对象类型的对象属性。
   * 
   * @param source
   * @param getMethodName
   * @return
   */
  protected Object exportObject(Object source, String getMethodName) {
    return getPropValue(source, getMethodName);
  }

  protected Object exportObject(Object source, String[] getMethodNames) {
    return getPropValue(source, getMethodNames);
  }

  /**
   * 导入String类型的对象属性。
   * 
   * @param target
   * @param setMethodName
   * @param value
   */
  protected void importString(Object target, String setMethodName, String value) {
    setPropValue(target, setMethodName, value);
  }

  /**
   * 导入Integer类型的对象属性。
   * 
   * @param target
   * @param setMethodName
   * @param value
   */
  protected void importInteger(Object target, String setMethodName, String value) {
    if (value == null)
      setPropValue(target, setMethodName, null);
    else
      setPropValue(target, setMethodName, new Integer(value));
  }

  /**
   * 导入Date类型的对象属性。
   * 
   * @param target
   * @param setMethodName
   * @param value
   */
  protected void importDatetime(Object target, String setMethodName, String value)
      throws ParseException {
    if (value == null)
      setPropValue(target, setMethodName, null);
    else
      try {
        setPropValue(target, setMethodName, FormatSettings.parseDatetime(FormatSettings.SDFyMdHms,
            value));
      } catch (Exception e) {
        setPropValue(target, setMethodName, FormatSettings.parseDatetime(FormatSettings.SDFyMd,
            value));
      }
  }

  /**
   * 导入BigDecimal类型的对象属性。
   * 
   * @param target
   * @param setMethodName
   * @param value
   */
  protected void importBigDecimal(Object target, String setMethodName, String value) {
    if (value == null)
      setPropValue(target, setMethodName, null);
    else
      setPropValue(target, setMethodName, new BigDecimal(value));
  }

  /**
   * 导入Boolean类型的对象属性。
   * 
   * @param target
   * @param setMethodName
   * @param value
   */
  protected void importBoolean(Object target, String setMethodName, String value) {
    if (value == null || value.equals(new String("")))
      setPropValue(target, setMethodName, null);
    else
      setPropValue(target, setMethodName, value.equalsIgnoreCase("true") ? Boolean.TRUE
          : Boolean.FALSE);
  }

  /**
   * 导入对象类型的对象属性
   * 
   * @param target
   * @param setMethodName
   * @param value
   * @param valueClass
   */
  protected void importObject(Object target, String setMethodName, Object value, Class valueClass) {
    setPropValue(target, setMethodName, value, valueClass);
  }

  /**
   * 从指定的接口对象赋值。
   * 
   * @param source
   */
  public void assignFrom(IPersistent source) {
    this.uuid = exportString(source, "getUuid");
  }

  /**
   * 将数据赋值给指定的接口对象。
   * 
   * @param source
   */
  public void assignTo(IPersistent target) throws BusinessException, ParseException,
      HibernateException {
    importString(target, "setUuid", "".equals(this.uuid) ? null : this.uuid);
  }

  // /////////////////////////
  // 属性方法

  public String getUuid() {
    return uuid;
  }

  public void setUuid(String uuid) {
    this.uuid = uuid;
  }

}
